package web

import (
	"errors"
	"github.com/globalsign/mgo"
	"jgt-oper/src/bll"
	"jgt-oper/src/context"
	"jgt-oper/src/schema"
	"jgt-oper/src/util"
	"time"
)

// ParkingController 停车位管理控制器
type ParkingController struct {
	ParkingBll *bll.Parking `inject:""`
}

// Create 创建停车位节点
func (a *ParkingController) Create(ctx *context.Context) error {
	ctx.WriteOperateLog("ParkingController.Create", "停车位管理-创建数据")
	//	获取参数
	params := new(schema.ParkingCParams)
	if err := ctx.ParseJSON(params); err != nil {
		return ctx.ResErrBadRequest(err)
	}
	//	构造存储结构
	item := new(schema.Parking)
	item.Creator = ctx.GetUserID()
	item.ID = 0
	item.RecordID = util.UUID()
	item.Created = time.Now().Unix()
	item.Deleted = 0
	//	校验node_type和parent_id参数
	if params.NodeType == 10 && params.ParentID != "" {
		return ctx.ResErrInternalServer(errors.New("parent_id参数错误"))
	} else if params.NodeType != 10 && params.ParentID == "" {
		return ctx.ResErrInternalServer(errors.New("parent_id参数不能为空"))
	} else if params.NodeType != 10 && params.ParentID != "" {
		parentItem, err := a.ParkingBll.Get(params.ParentID)
		if err != nil && err != mgo.ErrNotFound {
			return ctx.ResErrInternalServer(err)
		}
		//	检查父节点类型码和创建的节点类型码是否级联
		if err == mgo.ErrNotFound || (parentItem.NodeType+10) != params.NodeType {
			return ctx.ResErrBadRequest(errors.New("node_type或者parent_id参数错误"))
		}
	}
	//	添加分级码
	levelCode, err := a.ParkingBll.GetLevelCode(params.ParentID)
	if err != nil {
		return ctx.ResErrInternalServer(errors.New("分级码获取错误"))
	}
	item.LevelCode = levelCode
	item.NodeName = params.NodeName
	item.NodeType = params.NodeType
	item.ParentID = params.ParentID
	item.Status = 1

	if params.NodeType == 50 {
		item.ParkingType = params.ParkingType
		item.OwnerName = params.OwnerName
		item.OwnerTel = params.OwnerTel
		item.SerialNumber = params.SerialNumber
	}

	//	传递存储
	err = a.ParkingBll.Create(item)
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}
	//	返回ok
	return ctx.ResOK()
}

// QueryChildrenNodes 查询子节点
func (a *ParkingController) QueryChildrenNodes(ctx *context.Context) error {
	ctx.WriteOperateLog("ParkingController.QueryIndex", "停车位管理-查询停车场")
	var (
		items []*schema.Parking
		err   error
	)
	//	获取节点record_id
	recordID := ctx.Param("id")
	if recordID == "" { //获取一级节点列表
		items, err = a.ParkingBll.QueryIndex(10)
	} else { //	获取指定节点的子节点
		items, err = a.ParkingBll.QueryChildrenNodes(recordID)
	}
	//	检查错误
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}
	//	构造返回数据
	result := make([]map[string]interface{}, 0)
	for _, item := range items {
		itemMap := make(map[string]interface{})
		itemMap["node_name"] = item.NodeName
		itemMap["node_type"] = item.NodeType
		itemMap["record_id"] = item.RecordID
		itemMap["parking_type"] = item.ParkingType
		itemMap["owner_name"] = item.OwnerName
		itemMap["owner_tel"] = item.OwnerTel
		itemMap["serial_number"] = item.SerialNumber
		itemMap["parent_id"] = recordID
		result = append(result, itemMap)
	}

	return ctx.ResSuccess(result)
}

// Update 更新
func (a *ParkingController) Update(ctx *context.Context) error {
	ctx.WriteOperateLog("ParkingController.Delete", "停车位管理-删除节点")
	//	获取更新参数
	params := new(schema.ParkingUParams)
	if err := ctx.ParseJSON(params); err != nil {
		return ctx.ResErrBadRequest(err)
	}
	//	获取节点的record_id
	recordID := params.RecordID
	//	构造用于执行数据库更新参数
	info := make(map[string]interface{})
	info["node_name"] = params.NodeName
	info["parking_type"] = params.ParkingType
	info["owner_name"] = params.OwnerName
	info["owner_tel"] = params.OwnerTel
	info["serial_number"] = params.SerialNumber
	//	执行更新操作
	err := a.ParkingBll.Update(recordID, info)
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}
	return ctx.ResOK()
}

// Delete 删除停车位节点
func (a *ParkingController) Delete(ctx *context.Context) error {
	ctx.WriteOperateLog("ParkingController.Delete", "停车位管理-删除节点")
	//	获取删除节点的record_id
	recordID := ctx.Param("id")
	//	检测是否含有子节点
	items, err := a.ParkingBll.QueryChildrenNodes(recordID)
	if err != nil {
		return ctx.ResErrInternalServer(errors.New("检测是否含有子节点发生错误"))
	}
	if len(items) > 0 {
		return ctx.ResErrInternalServer(errors.New("含有可用子节点，不能删除"))
	}
	//	构造更新参数
	info := map[string]interface{}{
		"deleted": time.Now().Unix(),
		"status":  2,
	}
	//	执行更新
	err = a.ParkingBll.Update(recordID, info)
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}
	return ctx.ResOK()
}
